freeslot("MT_GCZ_BUMPER", "S_GCZ_BUMPER", "S_GCZ_BUMPERHIT", "SPR_GCBM")
freeslot("MT_GCZ_PATROLBUMPER", "S_GCZ_PATROLBUMPER", "S_GCZ_PATROLBUMPERHIT")

// Regular bumper

mobjinfo[MT_GCZ_BUMPER] = {
	//$Sprite GCBMA0
	//$Name Golden Captial Zone Bumper
	spawnstate = S_GCZ_BUMPER,
	seestate = S_GCZ_BUMPERHIT,
	radius = 24*FRACUNIT,
	height = 32*FRACUNIT,
	doomednum = 2960,
	dispoffset = 0,
	deathstate = S_NULL,
	deathsound = sfx_s234,
	flags = MF_SPECIAL|MF_NOGRAVITY
}

states[S_GCZ_BUMPER] = {SPR_GCBM, FF_SEMIBRIGHT|A, -1, nil, 0, 0, S_GCZ_BUMPER}
states[S_GCZ_BUMPERHIT] = {SPR_GCBM, FF_ANIMATE|FF_FULLBRIGHT|A, 12, nil, 1, 3, S_GCZ_BUMPER}

local BUMPER_STRENGTH = 42

addHook("TouchSpecial", function(bumper, pmo)
	local hang = R_PointToAngle2(
		bumper.x, bumper.y,
		pmo.x, pmo.y
	)
	local vang = 0

	if (P_IsObjectOnGround(pmo) == false)
		vang = R_PointToAngle2(
			FixedHypot(bumper.x, bumper.y), bumper.z + (bumper.height >> 1),
			FixedHypot(pmo.x, pmo.y), pmo.z + (pmo.height >> 1)
		)
	end

	local str = (BUMPER_STRENGTH * bumper.scale) >> 1

	pmo.momx = FixedMul(FixedMul(str, cos(hang)), abs(cos(vang)))
	pmo.momy = FixedMul(FixedMul(str, sin(hang)), abs(cos(vang)))
	pmo.momz = FixedMul(str, sin(vang))

	if (pmo.player and pmo.player.valid)
		if (pmo.player.tiregrease == 0)
			for i = 0,1 do
				local grease = P_SpawnMobjFromMobj(pmo, 0, 0, 0, MT_TIREGREASE)
				grease.target = pmo
				grease.angle = pmo.angle
				grease.extravalue1 = i
			end
		end

		if (pmo.player.tiregrease < 2*TICRATE) // greasetics
			pmo.player.tiregrease = 2*TICRATE
		end
	end

	if (bumper.state != bumper.info.seestate)
		S_StartSound(bumper, bumper.info.deathsound)
		bumper.state = bumper.info.seestate
	end

	return true
end, MT_GCZ_BUMPER)

addHook("MobjSpawn", function(bumper)
	bumper.shadowscale = FRACUNIT
	bumper.destscale = $1 << 1
	P_SetScale(bumper, bumper.destscale)
end, MT_GCZ_BUMPER)

// Patrolling bumper

mobjinfo[MT_GCZ_PATROLBUMPER] = {
	//$Sprite GCBMA0
	//$Name Golden Capital Patrolling Bumper
	spawnstate = S_GCZ_PATROLBUMPER,
	seestate = S_GCZ_PATROLBUMPERHIT,
	radius = 24*FRACUNIT,
	height = 32*FRACUNIT,
	doomednum = 2961,
	dispoffset = 0,
	deathstate = S_NULL,
	deathsound = sfx_s234,
	speed = FRACUNIT * 4,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_ENEMY
}

states[S_GCZ_PATROLBUMPER] = {SPR_GCBM, FF_SEMIBRIGHT|A, -1, nil, 0, 0, S_GCZ_PATROLBUMPER}
states[S_GCZ_PATROLBUMPERHIT] = {SPR_GCBM, FF_ANIMATE|FF_FULLBRIGHT|A, 12, nil, 1, 3, S_GCZ_PATROLBUMPER}

local BUMPER_STRENGTH = 42

addHook("TouchSpecial", function(bumper, pmo)
	local hang = R_PointToAngle2(
		bumper.x, bumper.y,
		pmo.x, pmo.y
	)
	local vang = 0

	if (P_IsObjectOnGround(pmo) == false)
		vang = R_PointToAngle2(
			FixedHypot(bumper.x, bumper.y), bumper.z + (bumper.height >> 1),
			FixedHypot(pmo.x, pmo.y), pmo.z + (pmo.height >> 1)
		)
	end

	local str = (BUMPER_STRENGTH * bumper.scale) >> 1

	pmo.momx = FixedMul(FixedMul(str, cos(hang)), abs(cos(vang)))
	pmo.momy = FixedMul(FixedMul(str, sin(hang)), abs(cos(vang)))
	pmo.momz = FixedMul(str, sin(vang))

	if (pmo.player and pmo.player.valid)
		if (pmo.player.tiregrease == 0)
			for i = 0,1 do
				local grease = P_SpawnMobjFromMobj(pmo, 0, 0, 0, MT_TIREGREASE)
				grease.target = pmo
				grease.angle = pmo.angle
				grease.extravalue1 = i
			end
		end

		if (pmo.player.tiregrease < 2*TICRATE) // greasetics
			pmo.player.tiregrease = 2*TICRATE
		end
	end

	if (bumper.state != bumper.info.seestate)
		S_StartSound(bumper, bumper.info.deathsound)
		bumper.state = bumper.info.seestate
	end

	return true
end, MT_GCZ_PATROLBUMPER)

addHook("MobjSpawn", function(bumper)
	bumper.shadowscale = FRACUNIT
	bumper.destscale = $1 << 1
	P_SetScale(bumper, bumper.destscale)
end, MT_GCZ_PATROLBUMPER)

addHook("MobjThinker", function(mo)
	local speed = FixedMul(mo.info.speed, mo.scale)
	local xdir = FixedMul(sin(mo.angle - ANGLE_90), speed)
	local ydir = FixedMul(cos(mo.angle + ANGLE_90), speed)
	
	local didMove
	if mo.currentmovement then
		didMove = P_TryMove(mo, mo.x + xdir, mo.y + ydir, true)
	else
		didMove = P_TryMove(mo, mo.x - xdir, mo.y - ydir, true)
	end
	if not didMove then
		--print("Flipping sawblade")
		--mo.currentmovement = not $
		mo.angle = $+ANGLE_180
	end
end, MT_GCZ_PATROLBUMPER)